CloudFormationでECS更新速度に関連した設定を操作する
はじめに
担当プロジェクトにてECSの更新に掛かる時間で超過気味の傾向があり、時間短縮を検討してみました。5〜10分程度かかるのはやむなしとしても、1回20分程度まで伸びることもある状態です。
更新プロセスの問題も考えられますが、AWSナレッジセンターに該当するトラブルシューティング内容があり、用いているCFnのテンプレートに幾つか項目を調整することで対処できる可能性を知りました。
コンテナインスタンスが DRAINING に設定されているときに停止が遅れる Amazon ECS タスクのトラブルシューティング
実際にどのあたりの項目かを調べてみましたが、同等の問題にあたった幾つかのブログ記事は管理コンソールでの解説が主でした。そこで、実際のkey設定箇所及びResourceにつけるべきかを調べた結果についてまとめました。なお、今回はFargateタイプが対象となります。
検討内容
AWSナレッジセンターの記事から、今回検討できる項目は以下の2つです。
- DeploymentConfiguration パラメータが正しく設定されていることを確認する
- 登録解除の遅延値が正しく設定されていることを確認する
ECS_CONTAINER_STOP_TIMEOUT
についてはFargateでは利用不可能な点で除外しています。
DeploymentConfiguration
対象となるのはAWS::ECS::Service
のDeploymentConfiguration
。
AWS::ECS::Service DeploymentConfiguration - AWS CloudFormation
DeploymentConfiguration詳細は、以下の図解記事が分かりやすいと思います。
ECSでコンテナのrolling update - Carpe Diem
MinimumHealthyPercentの初期値は100%、MaximumPercentの初期値は200%のため、初期は時短優先設定となります。
Type: AWS::ECS::Service DeploymentConfiguration: MinimumHealthyPercent: 100 MaximumPercent: 200
設定値は検証時に使っていたもので、特に最適というものではありません。
登録解除の遅延値
デプロイ時のライフサイクル設定を変更します。登録解除の遅延値を上げましたが、ヘルスチェックも含めて手を入れています。
設定に伴って影響がでる箇所については、以下の記事が分かりやすいと思います。
AWS CodeDeployの速度改善(ALB) - Qiita
ヘルスチェックにて今回触れるのは以下の項目です。
- HealthCheckIntervalSeconds
-
個々のターゲットのヘルスチェックの概算間隔 (秒単位)。範囲は 5~300 秒です。ターゲットタイプが instance または ip の場合のデフォルトは 30 秒で、ターゲットタイプが lambda の場合のデフォルトは 35 秒です。
- HealthCheckTimeoutSeconds
-
ヘルスチェックを失敗と見なす、ターゲットからレスポンスがない時間 (秒単位)。範囲は 2~120 秒です。ターゲットタイプが instance または ip の場合のデフォルトは 5 秒で、ターゲットタイプが lambda の場合のデフォルトは 30 秒です。
- UnhealthyThresholdCount
-
ターゲットが異常であると見なされるまでに必要なヘルスチェックの連続失敗回数。範囲は 2~10 です。デフォルトは 2 です。
Groupからの登録解除遅延についてはTargetGroupAttributes
にてderegistration_delay.timeout_seconds
をKey-Valueの組み合わせで登録します。
- deregistration_delay.timeout_seconds
-
登録解除するターゲットの状態が draining から unused に変わるのを Elastic Load Balancing が待機する時間 (秒単位)。範囲は 0 ~ 3600 秒です。デフォルト値は 300 秒です。ターゲットが Lambda 関数である場合、この属性はサポートされません。
公式ドキュメント上では以下の項目にて詳細が掲載されています。
ターゲットグループのヘルスチェック - Elastic Load Balancing AWS::ElasticLoadBalancingV2::TargetGroup TargetGroupAttribute - AWS CloudFormation
Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: HealthCheckIntervalSeconds: 5 HealthCheckTimeoutSeconds: 5 UnhealthyThresholdCount: 2 TargetGroupAttributes: - Key: deregistration_delay.timeout_seconds Value: '50'
設定値は検証時に使っていたもので、特に最適というものではありません。
あとがき
管理コンソール上の設定とCFn上の項目の一致と、単純にKey-Valueとして設定すればよいのか、listとして組むのかを只管検証して進めました。CFnで済ませる場合の方法まで直ぐにはたどり着き難かったため、参考になると幸いです。